﻿#define _CRT_SECURE_NO_WARNINGS 1

//#include <stdio.h>
//int main()
//{
//	int a, b, c;
//	a = 5;
//	c = ++a;
//	b = ++c, c++, ++a, a++;
//	b += a++ + c;
//	printf("a = %d b = %d c = %d\n:", a, b, c);
//	return 0;
//}

//不允许创建临时变量，交换两个整数的内容
//#include<stdio.h>
//
//int main()
//{
//	int a = 10;
//	int b = 20;
//	printf("交换前:");
//	printf("a = % d b = % d\n", a, b);
//	a = a ^ b;
//	b = a ^ b;
//	a = a ^ b;
//	printf("交换后:");
//	printf("a = % d b = % d\n", a, b);
//	return 0;
//}

////获取一个整数二进制序列中所有的偶数位和奇数位，分别打印出二进制序列
//#include<stdio.h>
//
//void printBits(int num)
//{
//	int binarySize = sizeof(int) * 8;
//	//奇数位
//	printf("奇数位：");
//	int i = 0;
//	for (i = binarySize-1; i>0; i -= 2)
//	{
//		int bit = (num & (1 << i)) ? 1 : 0;
//		printf("%d ", bit);
//	}
//	printf("\n");
//	//偶数位
//	printf("偶数位：");
//	for (i = binarySize-2; i >= 0; i -= 2)
//	{
//		int bit = (num & (1 << i)) ? 1 : 0;
//		printf("%d ", bit);
//	}
//	printf("\n");
//}
//
//int main()
//{
//	int n = 0;
//	printf("请输入一个整数：");
//	scanf("%d", &n);
//	printf("二进制序列：\n");
//	printBits(n);
//	return 0;
//}

//输入两个整数，求两个整数二进制格式有多少个位不同
//牛客网：https://www.nowcoder.com/questionTerminal/9c3b8a8d9f1c4ae3b709d04625586225
//#include <stdio.h>
//
//int main() {
//    int num1 = 0;
//    int num2 = 0;
//    int count = 0;
//    scanf("%d %d", &num1, &num2);
//    int binarySize = sizeof(int) * 8;
//    for (int i = 0; i < binarySize; i++)
//    {
//        int bit1 = (num1 & (1 << i)) ? 1 : 0;
//        int bit2 = (num2 & (1 << i)) ? 1 : 0;
//        if (bit1 != bit2)
//            count++;
//    }
//    printf("%d\n", count);
//    return 0;
//}

/*
思路：
1. 先将m和n进行按位异或，此时m和n相同的二进制比特位清零，不同的二进制比特位为1
2. 统计异或完成后结果的二进制比特位中有多少个1即可
*/
//#include <stdio.h>
//int calc_diff_bit(int m, int n)
//{
//	int tmp = m ^ n;
//	int count = 0;
//	while (tmp)
//	{
//		tmp = tmp & (tmp - 1);
//		count++;
//	}
//	return count;
//}
//
//
//int main()
//{
//	int m, n;
//	while (scanf("%d %d", &m, &n) == 2)
//	{
//		printf("%d\n", calc_diff_bit(m, n));
//	}
//	return 0;
//}



//输入一个整数 n ，输出该数32位二进制表示中1的个数。其中负数用补码表示。
/*
方法三：
思路：采用相邻的两个数据进行按位与运算
举例：
9999：‭10 0111 0000 1111‬
第一次循环：n = 9999   n = n & (n - 1) = 9999 & 9998 = 9998
第二次循环：n = 9998   n = n & (n - 1) = 9998 & 9997 = 9996
第三次循环：n = 9996   n = n & (n - 1) = 9996 & 9995 = 9992
第四次循环：n = 9992   n = n & (n - 1) = 9992 & 9991 = 9984
第五次循环：n = 9984   n = n & (n - 1) = 9984 & 9983 = 9728
第六次循环：n = 9728   n = n & (n - 1) = 9728 & 9727 = 9216
第七次循环：n = 9216   n = n & (n - 1) = 9216 & 9215 = 8192
第八次循环：n = 8192   n = n & (n - 1) = 8192 & 8191 = 0
可以观察下：此种方式，数据的二进制比特位中有几个1，循环就循环几次，而且中间采用了位运算，处理起来比较高效
*/
//#include<stdio.h>
// 
//int count_one_bit(int n)
//{
//    int count = 0;
//    while (n)
//    {
//        n = n & (n - 1);
//        count++;
//    }
//    return count;
//}
// 
//int main()
//{
//    int num = 0;
//    scanf("%d", &num);
//    int number = count_one_bit(num);
//    printf("数据的二进制比特位中1的个数有：%d\n", number);
//    return 0;
//}

//#include<stdio.h>
//int main()
//{
//	int a = 3;
//	int b = -5;
//	int c = a & b;//按（2进制）位与
//	//00000000000000000000000000000011 --- a的补码
//	//10000000000000000000000000000101 --- b的原码
//	//11111111111111111111111111111010 --- b的原码取反
//
//	//11111111111111111111111111111011 --- b的补码
// // & 00000000000000000000000000000011 --- a的补码
//	//----------------------------------------------
//		//00000000000000000000000000000011 --- c的补码
//		//00000000000000000000000000000011 --- c的原码 == 3
//		printf("%d\n", c);
//		return 0;
//}


//#include<stdio.h>
//int main()
//{
//	int a = 3;
//	int b = -5;
//	//00000000000000000000000000000011 --- 3的补码
//	//10000000000000000000000000000101 
//	//11111111111111111111111111111010
//	//11111111111111111111111111111011 --- -5的补码
//	int c = a ^ b;
//	//00000000000000000000000000000011
//	//11111111111111111111111111111011
//	//11111111111111111111111111111000
//	//10000000000000000000000000000111
//	//10000000000000000000000000001000
//	//
//	printf("%d\n", c);
//
//	return 0;
//}


//#include<stdio.h>
//#include<assert.h>
//size_t my_strlen(const char* str)
//{
//	assert(str);
//	size_t count = 0;
//	while (*str != '\0')//'0'---> 0
//	{
//		count++;
//		str++;
//	}
//	return count;
//}
//
//int main()
//{
//	char arr[] = "hello bit";
//	size_t len = my_strlen(arr);
//	printf("len=%zd\n", len);
//	return 0;
//}


//#include <stdio.h>
//int main()
//{                  
//	int i = 0, a = 0, b = 2, c = 3, d = 4;
//	i = a++ || ++b || d++;
//	printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
//	printf("i=%d\n", i);
//	return 0;
//}


#include <stdio.h>
int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;//------&& -- 左边操作数如果为假，右边无需计算
	printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
	printf("i=%d\n", i);
	return 0;
}